<?php

class UploadBlob
{
    private $cachepath; //上传目录
    private $targetpath; //上传目录
    private $tmpPath; //PHP文件临时目录
    private $blobNum; //第几个文件块
    private $totalBlobNum; //文件块总数
    private $fileName; //文件名

    public function __construct($cachepath, $targetpath, $obj_file, $blobNum, $totalBlobNum, $fileName)
    {
        $this->cachepath = $cachepath;
        $this->targetpath = $targetpath;
        $this->tmpPath = $obj_file["tmp_name"];
        $this->blobNum = $blobNum;
        $this->totalBlobNum = $totalBlobNum;
        $this->fileName = $fileName;

        $this->moveFile();
        $this->fileMerge();
    }

    //判断是否是最后一块，如果是则进行文件合成并且删除文件块
    private function fileMerge()
    {
        if ($this->blobNum == $this->totalBlobNum) {
            $blob = '';
            $tempfile = fopen($this->cachepath . '/' . $this->fileName . '.temp', "w");
            for ($i = 1; $i <= $this->totalBlobNum; $i++) {
                $blob = file_get_contents($this->cachepath . '/' . $this->fileName . '__' . $i);
                fwrite($tempfile, $blob);
                //file_put_contents($this->filepath . '/' . $this->fileName.'__temp', $blob);
            }
            fclose($tempfile);
            rename($this->cachepath . '/' . $this->fileName . '.temp', $this->targetpath . '/' . $this->fileName);
            $this->deleteFileBlob();
        }
    }

    //删除文件块
    private function deleteFileBlob()
    {
        for ($i = 1; $i <= $this->totalBlobNum; $i++) {
            @unlink($this->cachepath . '/' . $this->fileName . '__' . $i);
        }
    }

    //移动文件
    private function moveFile()
    {
        $this->touchDir();
        $filename = $this->cachepath . '/' . $this->fileName . '__' . $this->blobNum;
        move_uploaded_file($this->tmpPath, $filename);
    }

    //API返回数据
    public function apiReturn()
    {
        if ($this->blobNum == $this->totalBlobNum) {
            if (file_exists($this->targetpath . '/' . $this->fileName)) {
                $data['code'] = 2;
                $data['msg'] = 'success';
                $data['file_path'] = str_replace('../', '', $this->targetpath) . '/' . $this->fileName;
            }
        } else {
            if (file_exists($this->cachepath . '/' . $this->fileName . '__' . $this->blobNum)) {
                $data['code'] = 1;
                $data['msg'] = 'waiting for all';
                $data['file_path'] = '';
            }
        }
        header('Content-type: application/json');
        echo json_encode($data);
    }

    //建立上传文件夹
    private function touchDir()
    {

        if (!file_exists($this->cachepath))
            mkdir($this->cachepath, 0755, 1);
        if (!file_exists($this->targetpath))
            return mkdir($this->targetpath, 0755, 1);
    }
}

/*
//实例化并获取系统变量传参
$upload = new Upload($_FILES['file']['tmp_name'], $_POST['blob_num'], $_POST['total_blob_num'], $_POST['file_name']);
//调用方法，返回结果
$upload->apiReturn();
*/